<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!--
j s预编译
预编译分为全局预编译和函数预编译;
1、全局预编译发生在页面加载完毕时执行
(1)创建G0对象(Global 0bject)
(2)寻找var变量声明，并赋值undef ined (变量名作为是G0对象的属性名)
(3)寻找function函数声明，并赋值函数体(函数名作为是G0对象的属性名)
2、函数预编译发生在函数执行的前一刻
    -->
    <script>
        // G0={
        //
        // a: function a() {},
        //
        // b: undefined
        // }
        //预编译完成!!!!
        // console.log(a); // f a() {}
        // var a = 1;
        // var b = 2;

        // function a() {};
        // a = function() {};
        // console.log(a); // f () {}

        //函数预编译发生在函数执行的前一刻

        // 函数预编译过程(四个步骤)
        //     (1) 创建A0对象(Area 0b ject)
        //     (2) 寻找函数的形参和var变量声明， 将变量和形参作为是A0对象的属性名， 并赋值为undefined(变量和形参的提升)
        //     (3) 将实参和形参相互统一,即更改形参后的undefined为具体的形参值
        //     (4) 寻找function函数声明， 并赋值函数体(函数名作为是A0对象的属性名)

        //第一题
        // function fn(a) {
        //     console.log(a); //10
        //     var a = 100;
        //     console.log(a); //100
        // }
        // fn(10);


        //第二题
        // function fn(a, b) {
        //     console.log(a); //f a(){}
        //     var a = 99; //对a重新赋值
        //     console.log(a); //99
        //     function a() {}; //预编译已经提出，所以执行时不需要看这行代码
        //     console.log(a); //99
        //     console.log(b); //100
        //     var b = function() {};
        //     console.log(b); //f (){}
        // };
        // fn(10, 100)


        //第三题
        //三、
        //.A0={
        //.... 
        // a: function a() {
        //         //........， console. log( "2222");
        //         //
        //     },
        //     //
        //     b: undefined
        //     //}
        //     1. 函数预编译完成!!!!


        // function fn(a, b) {
        //     a(); //2222
        //     console.log(a); //f a(){}
        //     console.log(b); //u
        //     var a = 88;
        //     console.log(a); //88
        //     function a() {
        //         console.log("1111");
        //     };

        //     function a() {
        //         console.log("2222");
        //     };
        //     a(); //报错
        // };
        // fn(100);

        // global = 100;

        // function fn() {
        //     console.log(global); //u
        //     global = 200;
        //     console.log(global); //200
        //     var global = 300;
        // };
        // fn();
        // var global;


        //二、
        // function b() {
        //     return f;
        //     f = 10;

        //     function f() {
        //         var f = 11;
        //     }
        // };
        // // b();
        // console.log(b()); //f f(){  var f = 11;}



        //三、
        // var x = 1,
        //     // y = (z = 0);

        //     // function add(n) {
        //     //     return (n = n + 1);
        //     // };
        //     y = add(x);

        // function add(n) {
        //     return (n = n + 3);
        // };
        // z = add(x);
        // console.log(x); //1
        // console.log(y); //4
        // console.log(z); //4


        //四
        // var name = "Tom";
        // (function() {
        //     if (typeof name == "undefined") {
        //         var name = "Jack";
        //         console.log("Goodbye" + name); //GoodbyeJack
        //     } else {
        //         console.log("Hello" + name);
        //     }
        // })();


        //五
        // var _name = "Tom";
        // (function(_name) {

        //     if (typeof _name == "undefined") {
        //         var _name = "Jack";
        //         console.log("Goodbye" + _name);
        //     } else {
        //         console.log("Hello" + _name);
        //     }
        // })(_name);


        var _name = "Tom";
        (function() {
            //A0= {
            // console.log(_ name); // Tom
            if (typeof _name == "undefined") {
                let _name = "Jack";
                console.log("Goodbye " + _name);
            } else {
                console.log("Hello " + _name);
            }
        })();
        //Hello Tom
    </script>
</body>

</html>